package competiciones.fcf.cat;

import com.opencsv.CSVWriter;

import fcf.cat.Config;
import fcf.cat.DBase;
import fcf.cat.Exportar;
import fcf.cat.Importar;
import fcf.cat.Querys;
import fcf.cat.Utils;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;

import org.apache.commons.lang3.StringUtils;

public class Competiciones {

	public static String tabla_competiciones = Config.BD_RELACIONES+"."+Config.TABLA_COMPETICIONES;
	public static String tabla_competiciones_backup = Config.BD_RELACIONES+"."+Config.TABLA_COMPETICIONES_BACKUP;
	public static String newLine = "\n";
	public static String splitBy = ",";
	
	/**
	* Comprueba si existe portal_ffcatalunya.competiciones_url si no, crea la vista 
	* Exporta los datos de la vista portal_ffcatalunya.competiciones_url a un csv
	* Recorremos el csv obtenido,se modifican los nombres de las categorias, competiciones y grupos para utilizarlos en la url
	* borramos 
	* Con la nueva informacion,creamos otro csv y volcamos los datos en la tabla relaciones.competiciones
	* @throws SQLException 
	* @throws IOException 
	*/
	public static void init() throws SQLException, IOException{
		Utils.setResult("INICIO VOLCADO TABLA COMPETICIONES");
		checkVista(); //Comprueba si la vista competiciones_url,que muestra toda la relacion de grupos-competiciones-categorias, existe
		Exportar.MysqlToCsv(Config.BD_FFCATALUNYA+"."+Config.VISTA_COMPETICIONES,Config.COMPETICIONES_CSV,splitBy,newLine); //Exportamos datos de la vista a csv
		tratarCSV(); //tratamos los datos del csv con los datos nuevos para crear la tabla relaciones.competiciones
		Importar.CsvToMysql(Config.BD_RELACIONES,"competiciones","rel_competiciones.csv",splitBy,newLine); //importamos los datos tratados del nuevo csv a la tabla de relaciones.competiciones
	
	}
	
	/**
	* Modifica el csv con los datos de cada registro que ira a relaciones.competiciones
	*/
	public static void tratarCSV() {
		 
		String csvFile = Config.CSV_FOLDER+Config.COMPETICIONES_CSV;

		BufferedReader br = null;
		
		String line = newLine;
		String cvsSplitBy = splitBy;
		 
		try {
		 
			br = new BufferedReader(new FileReader(csvFile));
			String data = "";
			
			int i = 1;
			
			Utils.linea("Modificando CSV competiciones....");

			while ((line = br.readLine()) != null) {
			 
				String[] aux = line.split(cvsSplitBy);

				String cod_categoria = aux[0];
				String cod_grupo_categoria = aux[1];
				String cod_competicion = aux[2];
				String temporada = aux[3];
				String cod_grupo = aux[4];
				String categoria = eliminarValor("\"","",aux[5]); ;
				String nombre_categoria_url = validarString(aux[5]).toLowerCase();
				String competicion = eliminarValor("\"","",aux[6]);
				String nombre_competicio_url = validarString(aux[6]).toLowerCase();
				nombre_competicio_url = comprobarPrimerCaracter(nombre_competicio_url);
				String grupo = eliminarValor("\"","",aux[7]);
				String nombre_abreviado = eliminarValor("\"","",aux[8]);
				String grupo_url = validarString(aux[7]).toLowerCase();
				//grupo_url = eliminarValor("-","",grupo_url);

				data+=cod_categoria+","+cod_grupo_categoria+","+cod_competicion+","+temporada+","+cod_grupo+","+categoria+","+nombre_categoria_url+","+competicion+","+nombre_competicio_url+","+grupo+","+nombre_abreviado+","+grupo_url+";";
				//System.out.println(cod_categoria+"."+nombre_categoria_url+"."+nombre_competicio_url);
				i++;
			 }
			
			crearCSV(data); //creamos csv competiciones que importaremos a la base de datos
			Utils.linea("Relaciones.competiciones: "+i+" de registros creados "+Config.CSV_FOLDER+Config.COMPETICIONES_CSV);
					 
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
			
	/**
	 * 		
	 * @param aux
	 * @return
	 */
	public static String validarString(String aux){
				
		aux = comprobarPrimerCaracter(aux);
		aux = comprobarPrimerCaracter(aux);
		aux = eliminarValor("D´","-",aux);
		aux = eliminarValor("D'","-",aux);
		aux = eliminarValor("L'","-",aux);
		aux = eliminarValor(" ","-",aux);
		aux = eliminarValor("´","",aux);
		aux = eliminarValor("'","",aux);
		aux = eliminarValor(",","",aux);
		aux = eliminarValor("!","",aux);
		aux = eliminarValor("(","",aux);
		aux = eliminarValor(")","",aux);
		aux = eliminarValor(".","",aux);
		aux = eliminarValor("ª","",aux);
		aux = eliminarValor("--","-",aux);	
		aux = eliminarValor("--","-",aux);
		aux = eliminarValor("--","-",aux);
		aux = stripAccents(aux);
		aux = eliminarUltimoCaracter(aux);
		aux = eliminarUltimoCaracter(aux);
		return aux;
	}
	
	/**
	 * 
	 * @param val
	 * @param subs
	 * @param aux
	 * @return
	 */
	public static String eliminarValor(String val,String subs,String aux){
		return aux.replace(val,subs);
	}
	
	/**
	* 
	* @param val
	* @return
	*/
	public static String stripAccents(String val){
		return StringUtils.stripAccents(val);
	}

	/**
	* 		
	* @param val
	* @return
	*/
	public static String comprobarPrimerCaracter(String val){
		String primerChar = String.valueOf(val.charAt(0));
		
		if(primerChar.equals("-")){
			return val.substring(1);
		}
	
		if(primerChar.equals("\"")){
			return val.substring(1);
		}
		return val;
	}
	
	/**
	* 
	* @param val
	* @return
	*/
	public static String eliminarUltimoCaracter(String val){
		char ultimoChar = val.charAt(val.length() - 1);
		if(Character.isLetter(ultimoChar) || Character.isDigit(ultimoChar)){
			return val;
		}else{
			return val.substring(0,val.length()-1);
		}
	}
	
	/**
	* 
	* @throws SQLException
	*/
	public static void backup() throws SQLException{
		
		Utils.linea("INICIANDO BACKUP TABLA COMPETICIONES");
		
		if(DBase.existeTabla(Config.BD_RELACIONES,tabla_competiciones_backup)){
			DBase.deleteBD(Config.BD_RELACIONES,tabla_competiciones_backup);
		}

		DBase.backupTabla(Config.BD_RELACIONES,tabla_competiciones,Config.BD_RELACIONES,tabla_competiciones+"_backup");
			
		Utils.linea("FIN BACKUP TABLA COMPETICIONES");
	}
		
	/**
	* 
	* @param data
	*/
	public static void crearCSV(String data){
			 
		CSVWriter writer = null;
				
	    try {
			writer = new CSVWriter(new FileWriter(Config.CSV_FOLDER+"rel_competiciones.csv"), '\n', CSVWriter.NO_QUOTE_CHARACTER);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		// feed in your array (or convert your data to an array)
		data = eliminarValor("\"","",data);
		data = eliminarValor("'","",data);
		String[] entries = data.split(";");
		writer.writeNext(entries);
		
		try {
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	* 
	* @throws SQLException
	*/
	public static void checkVista() throws SQLException {
		
		Utils.linea("INICIANDO COMPROBACION VISTA COMPETICIONES");
		
		if(!DBase.existeTabla(Config.BD_FFCATALUNYA,Config.VISTA_COMPETICIONES)){ //comprueba que la vista de competiciones_url exista.Si no la creamos
			
			boolean res = DBase.query(Config.BD_FFCATALUNYA,Querys.vistaCompeticiones()); //ejecutamos query de la vista
			
			if(res){
				Utils.linea("VISTA =>"+Config.BD_FFCATALUNYA+" CREADA CORRECTAMENTE");
			}else{
				Utils.linea("ERROR AL CREAR VISTA =>"+Config.BD_FFCATALUNYA);
			}
			
			
		}
	}
		
}